package net.alche.fa.biz.iface;

import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.smartboot.http.server.HttpRequest;

import net.alche.al.util.AC;
import net.alche.sdd.pojo.MultipartFile;

// request & response
public abstract class FaHttpRequestResp {
  protected String jsSessionName = "JSESSIONID";
  public String httpUrl = null;

  // get post del put
  public abstract String getHttpType();

  public abstract String getBodyStr();

  public abstract Object getSessionVal(String key);

  public abstract void setSessionVal(String key, Object val);

  public abstract String getParam(String key);

  public abstract String getPathParam(String key);

  public abstract String[] getParamValues(String key);

  public abstract String getHeader(String headKey);

  public abstract void write(Object obj) throws IOException;

  public abstract void writeBytes(byte[] obj) throws IOException;

  public abstract void destroySession();

  // string
  public String getSessionStr(String key) {
    return AC.toStr(getSessionVal(key));
  }

  public void setSessionName(String name) {
    this.jsSessionName = name;
  }

  public abstract void setContentType(String contextType);

  public abstract void setPathAiParam(String source, String methodPath);

  public abstract MultipartFile readMultipartFile();

  public abstract Map<String, Object> getParamMap();

  public String getHttpUrl() {
    return httpUrl;
  }

  public void setHttpUrl(String url) {
    this.httpUrl = url;
  }

  public abstract String getIpAddr();

  public abstract String getIpAddrV6();

  public String getIPAddress(HttpRequest request) {
    String ip = null;
    // X-Forwarded-For：Squid 服务代理
    String ipAddresses = request.getHeader("X-Forwarded-For");

    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      // Proxy-Client-IP：apache 服务代理
      ipAddresses = request.getHeader("Proxy-Client-IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      // WL-Proxy-Client-IP：weblogic 服务代理
      ipAddresses = request.getHeader("WL-Proxy-Client-IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      // HTTP_CLIENT_IP：有些代理服务器
      ipAddresses = request.getHeader("HTTP_CLIENT_IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      // X-Real-IP：nginx服务代理
      ipAddresses = request.getHeader("X-Real-IP");
    }

    // 有些网络通过多层代理，那么获取到的ip就会有多个，一般都是通过逗号（,）分割开来，并且第一个ip为客户端的真实IP
    if (ipAddresses != null && ipAddresses.length() != 0) {
      ip = ipAddresses.split(",")[0];
    }

    // 还是不能获取到，最后再通过request.getRemoteAddr();获取
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      ip = request.getRemoteAddr();
    }
    return ip;
  }

  public String getIPAddress(HttpServletRequest request) {
    String ip = null;
    // X-Forwarded-For：Squid 服务代理
    String ipAddresses = request.getHeader("X-Forwarded-For");

    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      // Proxy-Client-IP：apache 服务代理
      ipAddresses = request.getHeader("Proxy-Client-IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      // WL-Proxy-Client-IP：weblogic 服务代理
      ipAddresses = request.getHeader("WL-Proxy-Client-IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      // HTTP_CLIENT_IP：有些代理服务器
      ipAddresses = request.getHeader("HTTP_CLIENT_IP");
    }

    if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      // X-Real-IP：nginx服务代理
      ipAddresses = request.getHeader("X-Real-IP");
    }

    // 有些网络通过多层代理，那么获取到的ip就会有多个，一般都是通过逗号（,）分割开来，并且第一个ip为客户端的真实IP
    if (ipAddresses != null && ipAddresses.length() != 0) {
      ip = ipAddresses.split(",")[0];
    }

    // 还是不能获取到，最后再通过request.getRemoteAddr();获取
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
      ip = request.getRemoteAddr();
    }
    return ip;
  }

  public abstract void setStatues(int status);

  public abstract String getHostName();
}
